#ifndef DATABASEMANAGER_H
#define DATABASEMANAGER_H

#include <QObject>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QVariant>
#include <QWidget>
#include <QString>
#include <QDebug>
#include <QDateTime>

#define HOST "120.46.25.211"
#define PORT 3306
#define DATABASE "cloudBackup_DB"
#define USER "lhr"
#define PASSWD "lhr.547521"

class DatabaseManager : public QObject
{
    Q_OBJECT
public:
    DatabaseManager(QObject *parent = nullptr);
    ~DatabaseManager();

    // 创建数据库连接
    bool buildConnection();

    // 根据手机号判断用户是否存在
    bool isUserExistByPhone(const QString& phone);

    // 根据用户名判断用户是否存在
    bool isUserExistByUsrName(const QString& UsrName);

    // 登录时 账号和密码匹配
    bool loginInputMatches(const QString& inputPhone,const QString& inputPasswd);

    // 注册时用户名是否已存在
    bool usrExisted(const QString& usrName);

    // 注册时手机号是否已存在
    bool phoneExisted(const QString& phone);

    // 添加新用户
    bool addNewUser(const QString& usrName,const QString& phone,const QString& password);

    // 更新登陆时间
    bool updateLoginTime(const QString& account);

    // 通过账号获取用户id
    int getIdByAccount(const QString& account);

    // 从数据库读取path+etag 存到内存fileInfoMap
    bool readFileAInfo(int usrID, std::unordered_map<std::string, std::string>& fileInfoMap);

    // 将map中所有备份文件的属性信息存储到数据库
    bool saveToDB(const std::string& filePath, int usrID, std::unordered_map<std::string, std::string>& fileInfoMap);

    // 文件被修改 更新数据库记录
    bool modifyRecord(const std::string& key, const std::string& val, int usrID);

    // 文件被删除 根据file_etag删除数据库记录
    bool removeRecord(int usrID, const std::string& key);

    // 新增文件 插入数据库记录
    bool insertRecord(int usrID, const std::string& key, const std::string& val);

    // 通过用户id获取密码
    bool getPasswdByUsrID(int usrID, QString& passwd);

    bool getUsrNameByUsrID(int usrID, QString& usrName);
public:
    QSqlDatabase db;
};

#endif // DATABASEMANAGER_H
